/*定义一个Person类，包含属性：姓名，年龄，性别；
写好相关的方法，能够构造的时候初始化或者后续修改属性值
定义一个Runnable抽象类，包含纯虚函数run。
定义一个Athlete类分别继承Person类和Runnable类，
重写run函数（能在调用run时打印 Athlete的姓名和跑步时的速度（生成随机数即可））。
在主函数中创建一个Athlete对象，
尝试：使用Person指针指向该对象然后调用run函数      //不可行
尝试：使用Runnable指针指向该对象然后调用run函数。  //可行
哪些是可行的，哪些是不可行的？为什么？原因在注释中用明确的文字进行说明。*/
#include <iostream>
using namespace std;
#include <string>

class Person
{
private:
    string name;
    int age;
    string sex;
public:
    Person(string name,int age,string sex)
    :name(name),age(age),sex(sex){}
    ~Person(){}
    string getName()
    {
        return name;
    }
    int getAge()
    {
        return age;
    }
    string getSex()
    {
        return sex;
    }
    void setName()
    {
        cout<<"please input name:"<<endl;
        cin>>name;
    }
    void setAge()
    {
        cout<<"please input age:"<<endl;
        cin>>age;
    }
    void setSex()
    {
        cout<<"please input sex:"<<endl;
        cin>>sex;
    }
};

class Runnable
{
private:
    int x;
public:
    Runnable(int x=10):x(x){}
    ~Runnable(){}
    virtual void run()=0;//虚函数
    int getX()
    {
        return x;
    }
};

class Athlete:public Runnable,public Person
{
private: 
public:
    Athlete(string name,int age,string sex)
    :Person(name,age,sex){}
    ~Athlete(){}
    void run()
    {
        cout<<this->getName()<<endl;
        cout<<this->getX()<<endl;
    }
};

int main(int argc,char*argv[])
{
    Athlete a("he",25,"male");
    Runnable *pa=&a;
    pa->run();      //可行
    // Person *pb=&a;
    // pb->run();   //不可行
    return 0;
}